昨天那邊我推測Todo只有在他被動作的時候才會去connect DB,所以真的在被使用的地方照昨天的寫法會是在render的時候!但今天先來看看print
首先先稍微驗證一下想法是不是正確的,觸發SQL的是print(todo)
,那在python中什麼會被print()觸發呢!?答案是magic method __repr__
or __str__
那我們接著來看ORM filter回傳的type是什麼<class 'django.db.models.query.QuerySet'>
是這個QueruSet類別,這個我們昨天也有看到,那邊其實我到現在都還沒有很有把握說我懂了...
總之跟著這個類別下去找__repr__
or __str__
這兩個magic method
這邊看到會顯示出data,到表已經從db中拿到data了!
所以我們要再根據這個線索看看取得data是透過什麼方式!
這邊可以看到他對自己做slice取值self[: REPR_OUTPUT_SIZE + 1]
而這個動作又會觸發什麼magic method呢!?google一下~
找到啦~是__getitem__
那我們接著看看他會做什麼~
我們可以知道k是slice物件,所以會流向這邊
我這邊看了一下qs.query已經是組好的SQL了,尚未看到他怎麼組出來的~
而這邊有一個list(qs)
,這個會觸發magic method __iter__
在根據上圖的function找
一樣找線索
一樣找list的magic method __iter__
這邊就不細看了,粗看一下可以看到去執行SQL的地方~
先找query,直接print他的type看~
是在django.db.models.sql.query.Query
那這邊的connections我們也很熟悉了,他就是DatabaseWrapper
其中的ops.compiler呢~
這下就找到compiler本人囉!
最後到compiler中的execute_sql就可以看到他與db連接的地方囉~
就這樣挖著挖著就挖到與db連接的地方了,有很多python magic method如果沒接觸過python的可能會看不太習慣,不過還沒看到怎麼組出SQL了的地方就是了,是有看到類似的地方,看了一眼我就先當作沒看到了XD